/**
 * 数组相关函数
 * @exports CFArray
 * @constructor CFArray
 * @description 调用方法：$cf.CFArray.函数名称
 */

class CFArray {
  /**
   * 数组去重
   * @param {Array} arr 原数组
   * @returns {Array} 去重后的数组
   * @example
   * var arr = [1, 2, 2, 3];
   * $cf.CFArray.duplicateRemove(arr); // [1, 2, 3]
   */
  duplicateRemove(arr) {
    return [...new Set(arr)];
  }
  /**
   * 对象型数组去重
   * @param {Array<Object>} arr 原数组
   * @param {String} id 对象的属性值
   * @returns {Array} 根据属性值去重后的数组
   * @example
   * var arr = [
   *      {
   *          name: 'a',
   *          age: 1
   *      }, {
   *          name: 'b',
   *          age: 2
   *      }, {
   *          name: 'a',
   *          age: 3
   *      }
   * ];
   * $cf.CFArray.duplicateRemoveById(arr, 'name'); // [{name: 'a', age: 1}, {name: 'b', age: 2}]
   */
  duplicateRemoveById(arr, id) {
    let result = [];
    let obj = {};
    // 利用对象访问属性值的方式，判断键值对是否存在
    for (let i = 0; i < arr.length; i++) {
      if (!obj[arr[i][id]]) {
        result.push(arr[i]);
        obj[arr[i][id]] = true;
      }
    }
    return result;
  }
  /**
   * 数组值类型比较
   * @param {Array} arr1 数组1
   * @param {Array} arr2 数组2
   * @return {Boolean} 是否相等
   * @example
   * var arr1 = [1, 2];
   * var arr2 = ['1', 2];
   * $cf.CFArray.equals(arr1, arr2); // false
   */
  equals(arr1, arr2) {
    let set1 = new Set(arr1);
    let set2 = new Set(arr2);
    let union = new Set([...set1, ...set2]);
    return set1.size === union.size;
  }
  /**
   * 检查是否为数组
   * @param {*} val 检查值
   * @returns {Boolean} 是否为数组
   * @example
   * $cf.CFArray.isArray([]); // true
   * $cf.CFArray.isArray(''); // false
   */
  isArray(val) {
    // 支持isArray方法
    if (Array.isArray) {
      return Array.isArray(val);
    }
    // 兼容低版本浏览器
    return Object.prototype.toString.call(val) === '[object Array]';
  }
  /**
   * 数组通过属性排序
   * @param {Array<object>} arr 原始数组
   * @param {String} propertypeName 数组属性名称
   * @returns {Array} 排序后的数组
   * @example
   * var arr = [
   *      {
   *          name: 'a',
   *          age: 1
   *      }, {
   *          name: 'b',
   *          age: 3
   *      }, {
   *          name: 'c',
   *          age: 2
   *      }
   * ];
   * var result = $cf.CFArray.sortByArg(arr, 'age');
   */
  sortByArg(arr, propertypeName) {
    arr.sort((obj1, obj2) => {
      let val1 = obj1[propertypeName];
      let val2 = obj2[propertypeName];
      return val1 < val2 ? -1 : val1 > val2 ? 1 : 0;
    });
    return arr;
  }
  /**
   * 获取只包含值类型元素的数组最小值
   * @param {Array<number>} arr 值类型元素数组
   * @returns {Number} 数组内最小值
   * @example
   * $cf.CFArray.minNum([1, 2, 3]); // 1
   */
  minNum(arr) {
    return Math.min.apply(Math, arr);
  }
  /**
   * 获取只包含值类型元素的数组最大值
   * @param {Array<number>} arr 值类型元素数组
   * @returns {Number} 数组内最大值
   * @example
   * $cf.CFArray.maxNum([1, 2, 3]); // 3
   */
  maxNum(arr) {
    return Math.max(...arr);
  }
}

export default CFArray;
